Sean Trott and Alex Liebscher

Introduction

We have several dependent variables which we would like to model as accurately as possible to determine the variables which contribute most to their outcomes. In particular, we care about the effect of the metaphor (or lack thereof) in each project. We first explore the data a little, and then begin a series of model comparisons for the dependent variables. Comparing models gives transparency to the contributions of each variable toward the target.

  1. Do projects that use metaphor generally receive better funding? How does using metaphor (and which type of metaphor family) influence campaign success, number of backers, and mean donation?

  2. Does higher metaphor productivity change the result?

  3. How can we characterize projects by the metaphors they employ?

  4. Within a metaphor family, are there canonical instantiations of a metaphor? (E.g. “fight battle”). Or even if productivity is low generally, are instantiations varied?

  5. How does metaphor vary with other interesting features, such as project description length, goal amount, project type/category, cancer type, or recipient gender?

Data Exploration

Projects per year

ggplot(dat) + geom_bar(aes(year), stat="count") + ggtitle("Number of projects per year")

There are very few projects before 2014, and so for simplicity’s sake and to simplify the model just a tad, we remove 2013 and before.

dat = dat[dat$year >= 2014, ]

Projects per month

dat$month <- factor(dat$month)

dat %>%
  ggplot() + labs(title="Counts in Months") +
  geom_bar(aes(month)) +
  scale_x_discrete(labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))

Interestingly, there are a ton of January projects. This might have to do with scraping the site which lists projects chronologically.

Projects per day of the week

dat$day_of_week <- factor(dat$day_of_week)

dat %>%
  ggplot() + labs(title="Counts in Days of the Week") +
  geom_bar(aes(day_of_week)) +
  scale_x_discrete(labels = c("Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"))

Projects from the US

ggplot(dat) + geom_bar(aes(x=factor(from_US)), stat="count") + labs(x="From US", title="Number of projects from US")

Most projects are US based. Reduce the model complexity by restricting to US then.

dat <- dat[dat$from_US == 1, ]

Project durations

Kickstarter projects are usually given 30 days to meet their goal, so most projects revolve around that duration. Some are shorter and some are longer though. Categorize each of those bins.

probs = c(0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0)
labs = c("10", "25", "50", "75", "90", "100")
quants = quantile(dat$duration_float, probs, names=F)

dat$dur_cat = ""

for (i in 1:6) {
  dat[dat$duration_float >= quants[i] & dat$duration_float <= quants[i+1], ]$dur_cat = labs[i]
}
dat$dur_cat = factor(dat$dur_cat, ordered = T, levels = labs)

dat %>%
  ggplot() + labs(title = "Duration Categories") +
  geom_bar(aes(dur_cat, fill=dur_cat), position="dodge")

Metaphor instantiation

Where is the first metaphor instantiated? If it comes within the first quarter of the text, does that make a difference, compared to the second quarter or second half? Categorize each project.

dat$inst = ""
dat[dat$first_instantiation == -1.0, ]$inst = "none"
dat[dat$first_instantiation >= 0 & dat$first_instantiation < 0.25, ]$inst = "firstquarter"
dat[dat$first_instantiation >= 0.25 & dat$first_instantiation < 0.5, ]$inst = "secondquarter"
dat[dat$first_instantiation >= 0.5, ]$inst = "secondhalf"

dat$inst = factor(dat$inst)

dat %>%
  ggplot() + labs(x="First Metaphor Instantiation Category", title="Counts in First Metaphor Instantiation Categories") +
  geom_bar(aes(inst)) +
  scale_x_discrete(labels = c("No Metaphor", "First Quarter", "Second Quarter", "Second Half"))

Project goals, text lengths, and cancer types

We scale/z-score the continuous variables according to how we wish to interpret the coefficients of the model. From Andrew Gelman: “Standardizing puts things on an approximately common scale …. (Standarize for) comparing coefficients for different predictors within a model”. Binary and categorical variables are left as is.

dat$goal_sc <- scale(dat$goal)

dat %>%
  ggplot() + labs(title="Goal Amount Distribution") +
  geom_density(aes(goal))

dat$text_length_words_sc <- scale(dat$text_length_words)

dat %>%
  ggplot() + labs(title="Text Length Distribution") +
  geom_density(aes(text_length_words))

dat$photos_sc <- scale(dat$photos)

dat %>%
  ggplot() + labs(title="Photos Distribution") +
  geom_density(aes(photos))

dat$updates_sc <- scale(dat$updates)

dat %>%
  ggplot() + labs(title="Updates Distribution") +
  geom_density(aes(updates))

dat$shares_sc <- scale(dat$shares)

dat %>%
  ggplot() + labs(title="FB Shares Distribution") +
  geom_density(aes(shares))

dat$comments_sc <- scale(dat$comments)

dat %>%
  ggplot() + labs(title="Comments Distribution") +
  geom_density(aes(comments))

dat$friends_sc <- scale(dat$friends)

dat %>%
  ggplot() + labs(title="FB Friends Distribution") +
  geom_density(aes(friends))

dat %>%
  ggplot() + labs(title="Cancer Type Counts") +
  geom_bar(aes(x=cancer_type)) +
  theme(axis.text.x=element_text(angle = 60, hjust=1))

Potential outliers which we may want to remove:

# nrow(dat[dat$comments > 25, ])
nrow(dat[dat$goal > 4e5, ])
## [1] 3
dat = dat[dat$goal <= 4e5, ]

nrow(dat[dat$photos > 100, ])
## [1] 1
dat = dat[dat$photos <= 100, ]

nrow(dat[dat$updates > 100, ])
## [1] 7
dat = dat[dat$updates <= 100, ]

nrow(dat[dat$shares > 20000, ])
## [1] 0
dat = dat[dat$shares <= 20000, ]

Project metaphors

No metaphor (b = 0 & j = 0) Any metaphor (b > 0 || j > 0) Some journey (j > 0) Some battle (b > 0) Some journey, no battle (b = 0 & j > 0) Some battle, no journey (b > 0 & j = 0) Some both (b > 0 & j > 0)

We break down each project into how the metaphor families are distributed within the project. Very few projects have both metaphors (< 25), are dominated by journey metaphors (< 25), or have only journey metaphors (< 20).

dat$no_metaphor = dat$battle_salience == 0.0 & dat$journey_salience == 0.0
dat$any_metaphor = 1 - dat$no_metaphor
dat$dom_journey = dat$journey_salience > dat$battle_salience
dat$dom_battle = dat$battle_salience > dat$journey_salience
dat$only_journey = dat$journey_salience > 0 & dat$battle_salience == 0.0
dat$only_battle = dat$journey_salience == 0.0 & dat$battle_salience > 0
dat$both_metaphor = dat$battle_salience > 0.0 & dat$journey_salience > 0.0

metaphor_counts = data.frame(counts = colSums(dat[, c("no_metaphor", "any_metaphor", "dom_journey", "dom_battle", "only_journey", "only_battle", "both_metaphor")]))

ggplot() + labs(x="Metaphor Type", y="Count", title="Count in Metaphor Types") +
  geom_bar(stat="identity", aes(x=row.names(metaphor_counts), y=metaphor_counts$counts))

Seem like comprehensive sources: https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#model-definition https://ase.tufts.edu/gsc/gradresources/guidetomixedmodelsinr/mixed%20model%20guide.html

Primary Analyses

We are interested in the effect that metaphor presence has on the funding status of a project.

DV: status, backers, mean donation IV: Goal amount, staff pick, category, text length words, duration category, year, metaphor instantiation, metaphor family salience, metaphor productivity

Various sources were used to determine what should be a random effect and what should be fixed, and how to model interactions and correlations between variables, including:

Status

nrow(dat)
## [1] 1052

In total, we have 1049 iid samples to work with.

dat %>%
  ggplot() + labs(title="Goal Amount Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(goal, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="Duration Distribution") + guides(fill=guide_legend(title="Status")) +
  geom_bar(aes(dur_cat, fill=fct_recode(factor(status), "Successful"="1", "Failed"="0")), position="dodge") +
  theme_minimal()

dat %>%
  ggplot() + labs(title="Text Length Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(text_length_words, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="Photos Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(photos, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="Updates Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(updates, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="FB Friends Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(friends, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="Comments Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(comments, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="FB Shares Distribution") + guides(color=guide_legend(title="Status")) +
  geom_density(aes(shares, color=fct_recode(factor(status), "Successful"="1", "Failed"="0"))) +
  theme_minimal()

dat %>%
  ggplot() + labs(title="Cancer Type Counts") + guides(fill=guide_legend(title="Status")) +
  geom_bar(aes(x=cancer_type, fill=fct_recode(factor(status), "Successful"="1", "Failed"="0")), position="dodge") +
  theme(axis.text.x=element_text(angle = 60, hjust=1))

Removed all random variabes except year because they didn’t help explain any variance in the data beyond what the residuals could capture.

Nesting and Chi2 differences: https://www.psychologie.uzh.ch/dam/jcr:ffffffff-b371-2797-0000-00000fda8f29/chisquare_diff_en.pdf

Model status

# no fixed effects, only random
mod.n = glmer(status ~ (1|year), 
                  data = dat, family = "binomial", nAGQ = 0)


# add duration category
mod.d = glmer(status ~ dur_cat + (1|year), 
                       data = dat, family = "binomial", nAGQ = 0)

# add length of text (in words)
mod.d.l = glmer(status ~ text_length_words_sc + dur_cat + (1|year), 
                              data = dat, family = "binomial", nAGQ = 0)

# add scaled goal amount
mod.d.l.g = glmer(status ~ goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                   data = dat, family = "binomial", nAGQ = 0)

# add first instantiation
mod.d.l.g.i = glmer(status ~ inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = "binomial", nAGQ = 0)

# add photos
mod.d.l.g.i.p = glmer(status ~ photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = "binomial", nAGQ = 0)

# add updates
mod.d.l.g.i.p.u = glmer(status ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = "binomial", nAGQ = 0)

# add comments
mod.d.l.g.i.p.u.c = glmer(status ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = "binomial", nAGQ = 0)

# add friends
mod.d.l.g.i.p.u.c.f = glmer(status ~ friends_sc + comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = "binomial", nAGQ = 0)

# add shares
mod.d.l.g.i.p.u.c.f.s = glmer(status ~ shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = "binomial", nAGQ = 0)

anova(mod.n, mod.d, test='Chisq')
## Data: dat
## Models:
## mod.n: status ~ (1 | year)
## mod.d: status ~ dur_cat + (1 | year)
##       Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
## mod.n  2 950.62 960.54 -473.31   946.62                         
## mod.d  7 956.25 990.96 -471.13   942.25 4.3706      5     0.4974
anova(mod.d, mod.d.l, test='Chisq')
## Data: dat
## Models:
## mod.d: status ~ dur_cat + (1 | year)
## mod.d.l: status ~ text_length_words_sc + dur_cat + (1 | year)
##         Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.d    7 956.25 990.96 -471.13   942.25                           
## mod.d.l  8 953.69 993.36 -468.84   937.69 4.5637      1    0.03266 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l, mod.d.l.g, test='Chisq')
## Data: dat
## Models:
## mod.d.l: status ~ text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g: status ~ goal_sc + text_length_words_sc + dur_cat + (1 | year)
##           Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)    
## mod.d.l    8 953.69 993.36 -468.84   937.69                             
## mod.d.l.g  9 917.27 961.89 -449.63   899.27 38.422      1  5.699e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g, mod.d.l.g.i, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g: status ~ goal_sc + text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g.i: status ~ inst + goal_sc + text_length_words_sc + dur_cat + (1 | 
## mod.d.l.g.i:     year)
##             Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
## mod.d.l.g    9 917.27 961.89 -449.63   899.27                         
## mod.d.l.g.i 12 920.65 980.15 -448.33   896.65 2.6132      3     0.4552
anova(mod.d.l.g.i, mod.d.l.g.i.p, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i: status ~ inst + goal_sc + text_length_words_sc + dur_cat + (1 | 
## mod.d.l.g.i:     year)
## mod.d.l.g.i.p: status ~ photos_sc + inst + goal_sc + text_length_words_sc + 
## mod.d.l.g.i.p:     dur_cat + (1 | year)
##               Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.d.l.g.i   12 920.65 980.15 -448.33   896.65                           
## mod.d.l.g.i.p 13 919.90 984.36 -446.95   893.90 2.7531      1    0.09706 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p, mod.d.l.g.i.p.u, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p: status ~ photos_sc + inst + goal_sc + text_length_words_sc + 
## mod.d.l.g.i.p:     dur_cat + (1 | year)
## mod.d.l.g.i.p.u: status ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + 
## mod.d.l.g.i.p.u:     dur_cat + (1 | year)
##                 Df    AIC    BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
## mod.d.l.g.i.p   13 919.90 984.36 -446.95   893.90                        
## mod.d.l.g.i.p.u 14 918.06 987.48 -445.03   890.06 3.835      1    0.05019
##                  
## mod.d.l.g.i.p    
## mod.d.l.g.i.p.u .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u, mod.d.l.g.i.p.u.c, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p.u: status ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + 
## mod.d.l.g.i.p.u:     dur_cat + (1 | year)
## mod.d.l.g.i.p.u.c: status ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + 
## mod.d.l.g.i.p.u.c:     text_length_words_sc + dur_cat + (1 | year)
##                   Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u   14 918.06 987.48 -445.03   890.06              
## mod.d.l.g.i.p.u.c 15 909.22 983.60 -439.61   879.22 10.844      1
##                   Pr(>Chisq)    
## mod.d.l.g.i.p.u                 
## mod.d.l.g.i.p.u.c  0.0009911 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c, mod.d.l.g.i.p.u.c.f, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c: status ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + 
## mod.d.l.g.i.p.u.c:     text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g.i.p.u.c.f: status ~ friends_sc + comments_sc + updates_sc + photos_sc + 
## mod.d.l.g.i.p.u.c.f:     inst + goal_sc + text_length_words_sc + dur_cat + (1 | year)
##                     Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c   15 909.22 983.60 -439.61   879.22              
## mod.d.l.g.i.p.u.c.f 16 910.33 989.66 -439.16   878.33 0.8944      1
##                     Pr(>Chisq)
## mod.d.l.g.i.p.u.c             
## mod.d.l.g.i.p.u.c.f     0.3443
anova(mod.d.l.g.i.p.u.c.f, mod.d.l.g.i.p.u.c.f.s, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f: status ~ friends_sc + comments_sc + updates_sc + photos_sc + 
## mod.d.l.g.i.p.u.c.f:     inst + goal_sc + text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g.i.p.u.c.f.s: status ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
##                       Df    AIC    BIC  logLik deviance Chisq Chi Df
## mod.d.l.g.i.p.u.c.f   16 910.33 989.66 -439.16   878.33             
## mod.d.l.g.i.p.u.c.f.s 17 895.66 979.95 -430.83   861.66 16.67      1
##                       Pr(>Chisq)    
## mod.d.l.g.i.p.u.c.f                 
## mod.d.l.g.i.p.u.c.f.s  4.448e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The final base model before adding metaphor variables:

summary(mod.d.l.g.i.p.u.c.f.s)
## Generalized linear mixed model fit by maximum likelihood (Adaptive
##   Gauss-Hermite Quadrature, nAGQ = 0) [glmerMod]
##  Family: binomial  ( logit )
## Formula: status ~ shares_sc + friends_sc + comments_sc + updates_sc +  
##     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat +  
##     (1 | year)
##    Data: dat
## 
##      AIC      BIC   logLik deviance df.resid 
##    895.7    979.9   -430.8    861.7     1035 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.1749 -0.4979 -0.3884 -0.1701 10.7705 
## 
## Random effects:
##  Groups Name        Variance Std.Dev.
##  year   (Intercept) 0        0       
## Number of obs: 1052, groups:  year, 6
## 
## Fixed effects:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          -1.917741   0.206239  -9.299  < 2e-16 ***
## shares_sc             0.748566   0.189913   3.942 8.09e-05 ***
## friends_sc            0.037991   0.087759   0.433   0.6651    
## comments_sc           0.161000   0.113029   1.424   0.1543    
## updates_sc           -0.532056   0.210262  -2.530   0.0114 *  
## photos_sc             0.222148   0.130103   1.707   0.0877 .  
## instnone             -0.018791   0.226887  -0.083   0.9340    
## instsecondhalf       -0.326627   0.279023  -1.171   0.2418    
## instsecondquarter     0.235555   0.307449   0.766   0.4436    
## goal_sc              -1.861764   0.318756  -5.841 5.20e-09 ***
## text_length_words_sc -0.109768   0.111038  -0.989   0.3229    
## dur_cat.L             0.202897   0.288209   0.704   0.4814    
## dur_cat.Q             0.386806   0.242672   1.594   0.1109    
## dur_cat.C            -0.015489   0.228861  -0.068   0.9460    
## dur_cat^4             0.008641   0.217278   0.040   0.9683    
## dur_cat^5             0.203603   0.189334   1.075   0.2822    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation matrix not shown by default, as p = 16 > 12.
## Use print(x, correlation=TRUE)  or
##     vcov(x)        if you need it

It appears that the intercept itself, the number of shares via Facebook, and the goal amount are all highly significant predictors of success. The goal amount is also a significant predictor.

Add metaphors

Use nAQG=0 because nAQG=1 cannot converge in a reasonable number (10,000) of iterations

See https://stats.stackexchange.com/questions/77313/why-cant-i-match-glmer-family-binomial-output-with-manual-implementation-of-g and https://www.rdocumentation.org/packages/lme4/versions/1.1-19/topics/glmer

# mod.no_metaphor = glmer(status ~ no_metaphor + shares_sc + friends_sc + comments_sc + goal_sc + updates_sc + photos_sc + text_length_words_sc + dur_cat + inst + (1|year),
#                         data = dat, family = "binomial", nAGQ = 0)
# mod.any_metaphor = glmer(status ~ any_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
#                         data = dat, family = "binomial", nAGQ = 0)
mod.dom_journey = glmer(status ~ dom_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)
mod.dom_journey.prod = glmer(status ~ journey_prod + dom_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)
mod.dom_battle = glmer(status ~ dom_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)
mod.dom_battle.prod = glmer(status ~ battle_prod + dom_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)
mod.only_journey = glmer(status ~ only_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)
mod.only_battle = glmer(status ~ only_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)
mod.both_metaphor = glmer(status ~ both_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = "binomial", nAGQ = 0)

# anova(mod.d.l.g.i.p.u.c.f.s, mod.no_metaphor)
# anova(mod.d.l.g.i.p.u.c.f.s, mod.any_metaphor)
anova(mod.d.l.g.i.p.u.c.f.s, mod.dom_journey)
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: status ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.dom_journey: status ~ dom_journey + shares_sc + friends_sc + comments_sc + 
## mod.dom_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_journey:     dur_cat + inst + (1 | year)
##                       Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 17 895.66 979.95 -430.83   861.66              
## mod.dom_journey       18 893.03 982.29 -428.52   857.03 4.6231      1
##                       Pr(>Chisq)  
## mod.d.l.g.i.p.u.c.f.s             
## mod.dom_journey          0.03154 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.dom_journey, mod.dom_journey.prod)
## Data: dat
## Models:
## mod.dom_journey: status ~ dom_journey + shares_sc + friends_sc + comments_sc + 
## mod.dom_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_journey:     dur_cat + inst + (1 | year)
## mod.dom_journey.prod: status ~ journey_prod + dom_journey + shares_sc + friends_sc + 
## mod.dom_journey.prod:     comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_journey.prod:     dur_cat + inst + (1 | year)
##                      Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.dom_journey      18 893.03 982.29 -428.52   857.03              
## mod.dom_journey.prod 19 894.08 988.29 -428.04   856.08 0.9577      1
##                      Pr(>Chisq)
## mod.dom_journey                
## mod.dom_journey.prod     0.3278
anova(mod.d.l.g.i.p.u.c.f.s, mod.dom_battle)
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: status ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.dom_battle: status ~ dom_battle + shares_sc + friends_sc + comments_sc + 
## mod.dom_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_battle:     dur_cat + inst + (1 | year)
##                       Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 17 895.66 979.95 -430.83   861.66              
## mod.dom_battle        18 896.64 985.89 -430.32   860.64 1.0191      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.dom_battle            0.3127
anova(mod.dom_battle, mod.dom_battle.prod)
## Data: dat
## Models:
## mod.dom_battle: status ~ dom_battle + shares_sc + friends_sc + comments_sc + 
## mod.dom_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_battle:     dur_cat + inst + (1 | year)
## mod.dom_battle.prod: status ~ battle_prod + dom_battle + shares_sc + friends_sc + 
## mod.dom_battle.prod:     comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_battle.prod:     dur_cat + inst + (1 | year)
##                     Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.dom_battle      18 896.64 985.89 -430.32   860.64              
## mod.dom_battle.prod 19 898.63 992.84 -430.31   860.63 0.0084      1
##                     Pr(>Chisq)
## mod.dom_battle                
## mod.dom_battle.prod     0.9271
anova(mod.d.l.g.i.p.u.c.f.s, mod.only_journey)
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: status ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.only_journey: status ~ only_journey + shares_sc + friends_sc + comments_sc + 
## mod.only_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.only_journey:     dur_cat + inst + (1 | year)
##                       Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 17 895.66 979.95 -430.83   861.66              
## mod.only_journey      18 893.53 982.78 -428.76   857.53 4.1294      1
##                       Pr(>Chisq)  
## mod.d.l.g.i.p.u.c.f.s             
## mod.only_journey         0.04214 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c.f.s, mod.only_battle)
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: status ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.only_battle: status ~ only_battle + shares_sc + friends_sc + comments_sc + 
## mod.only_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.only_battle:     dur_cat + inst + (1 | year)
##                       Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 17 895.66 979.95 -430.83   861.66              
## mod.only_battle       18 897.51 986.76 -430.75   861.51 0.1495      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.only_battle            0.699
anova(mod.d.l.g.i.p.u.c.f.s, mod.both_metaphor)
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: status ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.both_metaphor: status ~ both_metaphor + shares_sc + friends_sc + comments_sc + 
## mod.both_metaphor:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.both_metaphor:     dur_cat + inst + (1 | year)
##                       Df    AIC    BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 17 895.66 979.95 -430.83   861.66              
## mod.both_metaphor     18 896.71 985.96 -430.36   860.71 0.9434      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.both_metaphor         0.3314

The journey metaphor as the dominant metaphor almost signficantly predicts lower success (higher failure). Having only journey metaphors almost significantly lowers success.

Number of Backers

library(glmmTMB)
nrow(dat[dat$backers > 1200, ])
## [1] 11
ggplot() + labs(x="Number of Backers", title="Number of Backers Density") +
  geom_density(aes(dat$backers[dat$backers < 1200]))

We limit to 1200 because removing the outliers leaves us with a nicely shaped distribution.

dat.b <- dat[dat$backers < 1200, ]

Runa quick data dispersion test (see Rice 1995):

pchisq(2 * sum(dat$backers * log(dat$backers / mean(dat$backers))), length(dat$backers) - 1, lower.tail = F)
## [1] 0

H0: The data are fit well by a Poisson Distribution H1: Poisson fails to fit the data well

The Poisson distribution obviously does not fit the data well since p approx 0. Let’s use a NegBin instead, which can account for differences in the mean and variance.

dat.b %>%
  ggplot(aes(goal, backers)) + labs(title="Goal Amount Distribution") +
  geom_point(aes(alpha=0.1)) +
  theme_minimal()

dat.b %>%
  ggplot(aes(dur_cat, backers)) + labs(title="Duration Distribution") +
  geom_boxplot() +
  theme_minimal()

dat.b %>%
  ggplot(aes(text_length_words, backers)) + labs(title="Text Length Distribution") +
  geom_point(aes(alpha=0.1)) +
  theme_minimal()

dat.b %>%
  ggplot(aes(photos, backers)) + labs(title="Photos Distribution") +
  geom_point(aes(alpha=0.1)) +
  theme_minimal()

dat.b %>%
  ggplot(aes(updates, backers)) + labs(title="Updates Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat.b %>%
  ggplot(aes(friends, backers)) + labs(title="FB Friends Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat.b %>%
  ggplot(aes(comments, backers)) + labs(title="Comments Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat.b %>%
  ggplot(aes(shares, backers)) + labs(title="FB Shares Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat.b %>%
  ggplot(aes(cancer_type, backers)) + labs(title="Cancer Types") +
  geom_boxplot() +
  theme_minimal() +
  theme(axis.text.x=element_text(angle = 60, hjust=1))

Model backers

# no fixed effects, only random
mod.n <- glmmTMB(backers ~ (1|year), data = dat.b, family="nbinom2")

# add duration category
mod.d <- glmmTMB(backers ~ dur_cat + (1|year), data = dat.b, family="nbinom2")

# add length of text (in words)
mod.d.l <- glmmTMB(backers ~ text_length_words_sc + dur_cat + (1|year), data = dat.b, family="nbinom2")

# add scaled goal amount
mod.d.l.g <- glmmTMB(backers ~ goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat.b, family="nbinom2")

# add first instantiation
mod.d.l.g.i <- glmmTMB(backers ~ inst + goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat.b, family="nbinom2")

# add photos
mod.d.l.g.i.p <- glmmTMB(backers ~ photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat.b, family="nbinom2")

# add updates
mod.d.l.g.i.p.u <- glmmTMB(backers ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat.b, family="nbinom2")

# add comments
mod.d.l.g.i.p.u.c = glmmTMB(backers ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat.b, family="nbinom2")

# add friends
mod.d.l.g.i.p.u.c.f = glmmTMB(backers ~ friends_sc + comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat.b, family="nbinom2")

# add shares
mod.d.l.g.i.p.u.c.f.s = glmmTMB(backers ~ shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat.b, family="nbinom2")

anova(mod.n, mod.d, test='Chisq')
## Data: dat.b
## Models:
## mod.n: backers ~ (1 | year), zi=~0, disp=~1
## mod.d: backers ~ dur_cat + (1 | year), zi=~0, disp=~1
##       Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.n  3 12342 12357 -6168.1    12336                           
## mod.d  8 12337 12377 -6160.7    12321 14.765      5    0.01141 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d, mod.d.l, test='Chisq')
## Data: dat.b
## Models:
## mod.d: backers ~ dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l: backers ~ text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
##         Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)    
## mod.d    8 12337 12377 -6160.7    12321                             
## mod.d.l  9 12303 12348 -6142.5    12285 36.306      1  1.686e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l, mod.d.l.g, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l: backers ~ text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l.g: backers ~ goal_sc + text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
##           Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)    
## mod.d.l    9 12303 12348 -6142.5    12285                             
## mod.d.l.g 10 11976 12025 -5977.8    11956 329.56      1  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g, mod.d.l.g.i, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l.g: backers ~ goal_sc + text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l.g.i: backers ~ inst + goal_sc + text_length_words_sc + dur_cat + (1 | , zi=~0, disp=~1
## mod.d.l.g.i:     year), zi=~0, disp=~1
##             Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.d.l.g   10 11976 12025 -5977.8    11956                           
## mod.d.l.g.i 13 11972 12036 -5972.9    11946 9.7738      3    0.02059 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i, mod.d.l.g.i.p, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l.g.i: backers ~ inst + goal_sc + text_length_words_sc + dur_cat + (1 | , zi=~0, disp=~1
## mod.d.l.g.i:     year), zi=~0, disp=~1
## mod.d.l.g.i.p: backers ~ photos_sc + inst + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p:     dur_cat + (1 | year), zi=~0, disp=~1
##               Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)    
## mod.d.l.g.i   13 11972 12036 -5972.9    11946                             
## mod.d.l.g.i.p 14 11915 11984 -5943.6    11887 58.479      1  2.055e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p, mod.d.l.g.i.p.u, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l.g.i.p: backers ~ photos_sc + inst + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p:     dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l.g.i.p.u: backers ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u:     dur_cat + (1 | year), zi=~0, disp=~1
##                 Df   AIC   BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
## mod.d.l.g.i.p   14 11915 11984 -5943.6    11887                        
## mod.d.l.g.i.p.u 15 11916 11991 -5943.2    11886 0.877      1      0.349
anova(mod.d.l.g.i.p.u, mod.d.l.g.i.p.u.c, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u: backers ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u:     dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l.g.i.p.u.c: backers ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c:     text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
##                   Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
## mod.d.l.g.i.p.u   15 11916 11991 -5943.2    11886                         
## mod.d.l.g.i.p.u.c 16 11887 11966 -5927.4    11855 31.623      1  1.872e-08
##                      
## mod.d.l.g.i.p.u      
## mod.d.l.g.i.p.u.c ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c, mod.d.l.g.i.p.u.c.f, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c: backers ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c:     text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f: backers ~ friends_sc + comments_sc + updates_sc + photos_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f:     inst + goal_sc + text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
##                     Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c   16 11887 11966 -5927.4    11855              
## mod.d.l.g.i.p.u.c.f 17 11871 11955 -5918.6    11837 17.524      1
##                     Pr(>Chisq)    
## mod.d.l.g.i.p.u.c                 
## mod.d.l.g.i.p.u.c.f  2.836e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c.f, mod.d.l.g.i.p.u.c.f.s, test='Chisq')
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c.f: backers ~ friends_sc + comments_sc + updates_sc + photos_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f:     inst + goal_sc + text_length_words_sc + dur_cat + (1 | year), zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s: backers ~ shares_sc + friends_sc + comments_sc + updates_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     (1 | year), zi=~0, disp=~1
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f   17 11871 11955 -5918.6    11837              
## mod.d.l.g.i.p.u.c.f.s 18 11625 11714 -5794.3    11589 248.68      1
##                       Pr(>Chisq)    
## mod.d.l.g.i.p.u.c.f                 
## mod.d.l.g.i.p.u.c.f.s  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(mod.d.l.g.i.p.u.c.f.s)
##  Family: nbinom2  ( log )
## Formula:          
## backers ~ shares_sc + friends_sc + comments_sc + updates_sc +  
##     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat +  
##     (1 | year)
## Data: dat.b
## 
##      AIC      BIC   logLik deviance df.resid 
##  11624.6  11713.6  -5794.3  11588.6     1023 
## 
## Random effects:
## 
## Conditional model:
##  Groups Name        Variance  Std.Dev. 
##  year   (Intercept) 7.044e-10 2.654e-05
## Number of obs: 1041, groups:  year, 6
## 
## Overdispersion parameter for nbinom2 family (): 1.87 
## 
## Conditional model:
##                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)           4.83064    0.04924   98.11  < 2e-16 ***
## shares_sc             0.98043    0.06648   14.75  < 2e-16 ***
## friends_sc            0.04560    0.02433    1.87 0.060872 .  
## comments_sc           0.03131    0.03276    0.96 0.339135    
## updates_sc           -0.06942    0.04497   -1.54 0.122704    
## photos_sc             0.12014    0.03495    3.44 0.000588 ***
## instnone             -0.11514    0.06069   -1.90 0.057782 .  
## instsecondhalf       -0.06253    0.06819   -0.92 0.359164    
## instsecondquarter     0.03710    0.08440    0.44 0.660213    
## goal_sc               0.50436    0.04666   10.81  < 2e-16 ***
## text_length_words_sc  0.04999    0.02528    1.98 0.048004 *  
## dur_cat.L             0.05949    0.07982    0.75 0.456075    
## dur_cat.Q             0.12569    0.06717    1.87 0.061314 .  
## dur_cat.C             0.03883    0.06266    0.62 0.535454    
## dur_cat^4            -0.19877    0.05813   -3.42 0.000628 ***
## dur_cat^5             0.04274    0.04923    0.87 0.385268    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Add metaphors

# mod.no_metaphor = glmmTMB(backers ~ no_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
#                         data = dat.b, family = "nbinom2")
# mod.any_metaphor = glmmTMB(backers ~ any_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
#                         data = dat.b, family = "nbinom2")

mod.dom_journey = glmmTMB(backers ~ dom_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

mod.dom_journey.prod = glmmTMB(backers ~ journey_prod + dom_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

mod.dom_battle = glmmTMB(backers ~ dom_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

mod.dom_battle.prod = glmmTMB(backers ~ battle_prod + dom_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

mod.only_journey = glmmTMB(backers ~ only_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

mod.only_battle = glmmTMB(backers ~ only_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

mod.both_metaphor = glmmTMB(backers ~ both_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat.b, family = "nbinom2")

# anova(mod.d.l.g.i.p.u.c.f.s, mod.no_metaphor)
# anova(mod.d.l.g.i.p.u.c.f.s, mod.any_metaphor)
anova(mod.d.l.g.i.p.u.c.f.s, mod.dom_journey)
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c.f.s: backers ~ shares_sc + friends_sc + comments_sc + updates_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     (1 | year), zi=~0, disp=~1
## mod.dom_journey: backers ~ dom_journey + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.dom_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.dom_journey:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 11625 11714 -5794.3    11589              
## mod.dom_journey       19 11626 11720 -5794.1    11588 0.2697      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.dom_journey           0.6035
anova(mod.dom_journey, mod.dom_journey.prod)
## Data: dat.b
## Models:
## mod.dom_journey: backers ~ dom_journey + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.dom_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.dom_journey:     dur_cat + inst + (1 | year), zi=~0, disp=~1
## mod.dom_journey.prod: backers ~ journey_prod + dom_journey + shares_sc + friends_sc + , zi=~0, disp=~1
## mod.dom_journey.prod:     comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.dom_journey.prod:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                      Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.dom_journey      19 11626 11720 -5794.1    11588              
## mod.dom_journey.prod 20 11628 11727 -5794.0    11588 0.3793      1
##                      Pr(>Chisq)
## mod.dom_journey                
## mod.dom_journey.prod      0.538
anova(mod.d.l.g.i.p.u.c.f.s, mod.dom_battle)
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c.f.s: backers ~ shares_sc + friends_sc + comments_sc + updates_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     (1 | year), zi=~0, disp=~1
## mod.dom_battle: backers ~ dom_battle + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.dom_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.dom_battle:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 11625 11714 -5794.3    11589              
## mod.dom_battle        19 11625 11719 -5793.6    11587 1.3677      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.dom_battle            0.2422
anova(mod.dom_battle, mod.dom_battle.prod)
## Data: dat.b
## Models:
## mod.dom_battle: backers ~ dom_battle + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.dom_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.dom_battle:     dur_cat + inst + (1 | year), zi=~0, disp=~1
## mod.dom_battle.prod: backers ~ battle_prod + dom_battle + shares_sc + friends_sc + , zi=~0, disp=~1
## mod.dom_battle.prod:     comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.dom_battle.prod:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                     Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.dom_battle      19 11625 11719 -5793.6    11587              
## mod.dom_battle.prod 20 11626 11725 -5793.1    11586 0.8973      1
##                     Pr(>Chisq)
## mod.dom_battle                
## mod.dom_battle.prod     0.3435
anova(mod.d.l.g.i.p.u.c.f.s, mod.only_journey)
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c.f.s: backers ~ shares_sc + friends_sc + comments_sc + updates_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     (1 | year), zi=~0, disp=~1
## mod.only_journey: backers ~ only_journey + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.only_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.only_journey:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 11625 11714 -5794.3    11589              
## mod.only_journey      19 11626 11720 -5794.2    11588 0.0542      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.only_journey          0.8159
anova(mod.d.l.g.i.p.u.c.f.s, mod.only_battle)
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c.f.s: backers ~ shares_sc + friends_sc + comments_sc + updates_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     (1 | year), zi=~0, disp=~1
## mod.only_battle: backers ~ only_battle + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.only_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.only_battle:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 11625 11714 -5794.3    11589              
## mod.only_battle       19 11625 11719 -5793.7    11587 1.1951      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.only_battle           0.2743
anova(mod.d.l.g.i.p.u.c.f.s, mod.both_metaphor)
## Data: dat.b
## Models:
## mod.d.l.g.i.p.u.c.f.s: backers ~ shares_sc + friends_sc + comments_sc + updates_sc + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + , zi=~0, disp=~1
## mod.d.l.g.i.p.u.c.f.s:     (1 | year), zi=~0, disp=~1
## mod.both_metaphor: backers ~ both_metaphor + shares_sc + friends_sc + comments_sc + , zi=~0, disp=~1
## mod.both_metaphor:     updates_sc + photos_sc + goal_sc + text_length_words_sc + , zi=~0, disp=~1
## mod.both_metaphor:     dur_cat + inst + (1 | year), zi=~0, disp=~1
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 11625 11714 -5794.3    11589              
## mod.both_metaphor     19 11625 11719 -5793.6    11587 1.2987      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.both_metaphor         0.2544

It appears that the intercept itself, the number of shares via Facebook, the number of updates on the project page, the number of photos uploaded by the project creator, and the goal amount are all highly significant indicators of the number of backers. Not having any metaphors significantly decreases backers and higher number of words increases backers. A quartic regression of duration explains the data well. No metaphorical variables significantly explain the data.

Mean Donation

dat %>%
  ggplot() + labs(title="Mean Donation Density") +
  geom_density(aes(mean_donation+1))

dat = dat[dat$mean_donation < 500, ]

dat %>%
  ggplot() + geom_qq(aes(sample=mean_donation+1), distribution = qexp) + geom_qq_line(aes(sample=mean_donation+1), distribution = qexp)

dat %>%
  ggplot(aes(goal, mean_donation)) + labs(title="Goal Amount Distribution") +
  geom_point(aes(alpha=0.1)) +
  theme_minimal()

dat %>%
  ggplot(aes(dur_cat, mean_donation)) + labs(title="Duration Distribution") +
  geom_boxplot() +
  theme_minimal()

dat %>%
  ggplot(aes(text_length_words, mean_donation)) + labs(title="Text Length Distribution") +
  geom_point(aes(alpha=0.1)) +
  theme_minimal()

dat %>%
  ggplot(aes(photos, mean_donation)) + labs(title="Photos Distribution") +
  geom_point(aes(alpha=0.1)) +
  theme_minimal()

dat %>%
  ggplot(aes(updates, mean_donation)) + labs(title="Updates Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat %>%
  ggplot(aes(friends, mean_donation)) + labs(title="FB Friends Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat %>%
  ggplot(aes(comments, mean_donation)) + labs(title="Comments Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat %>%
  ggplot(aes(shares, mean_donation)) + labs(title="FB Shares Distribution") +
  geom_point(aes(alpha=0.1)) + 
  theme_minimal()

dat %>%
  ggplot(aes(cancer_type, mean_donation)) + labs(title="Cancer Types") +
  geom_boxplot() +
  theme_minimal() +
  theme(axis.text.x=element_text(angle = 60, hjust=1))

The data fit an exponential fairly well, so we model with Gamma and a log link (see above answer for reason).

Model mean donation

# no fixed effects, only random
mod.n = glmer(mean_donation+1 ~ (1|year), data = dat, family = Gamma(link = "log"))

# add duration category
mod.d = glmer(mean_donation+1 ~ dur_cat + (1|year), data = dat, family = Gamma(link = "log"))
## singular fit
# add length of text (in words)
mod.d.l = glmer(mean_donation+1 ~ text_length_words_sc + dur_cat + (1|year), data = dat, family = Gamma(link = "log"))
## singular fit
# add scaled goal amount
mod.d.l.g = glmer(mean_donation+1 ~ goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat, family = Gamma(link = "log"))
## singular fit
# add first instantiation
mod.d.l.g.i = glmer(mean_donation+1 ~ inst + goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat, family = Gamma(link = "log"))
## singular fit
# add photos
mod.d.l.g.i.p <- glmer(mean_donation+1 ~ photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat, family = Gamma(link = "log"))
## singular fit
# add updates
mod.d.l.g.i.p.u <- glmer(mean_donation+1 ~ updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), data = dat, family = Gamma(link = "log"))
## singular fit
# add comments
mod.d.l.g.i.p.u.c = glmer(mean_donation+1 ~ comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = Gamma(link = "log"))
## singular fit
# add friends
mod.d.l.g.i.p.u.c.f = glmer(mean_donation+1 ~ friends_sc + comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = Gamma(link = "log"))
## singular fit
# add shares
mod.d.l.g.i.p.u.c.f.s = glmer(mean_donation+1 ~ shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + (1|year), 
                                         data = dat, family = Gamma(link = "log"))
## singular fit
anova(mod.n, mod.d, test='Chisq')
## Data: dat
## Models:
## mod.n: mean_donation + 1 ~ (1 | year)
## mod.d: mean_donation + 1 ~ dur_cat + (1 | year)
##       Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
## mod.n  3 10631 10646 -5312.4    10625                         
## mod.d  8 10634 10674 -5309.0    10618 6.8226      5     0.2342
anova(mod.d, mod.d.l, test='Chisq')
## Data: dat
## Models:
## mod.d: mean_donation + 1 ~ dur_cat + (1 | year)
## mod.d.l: mean_donation + 1 ~ text_length_words_sc + dur_cat + (1 | year)
##         Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.d    8 10634 10674 -5309.0    10618                           
## mod.d.l  9 10632 10676 -5306.7    10614 4.5395      1    0.03312 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l, mod.d.l.g, test='Chisq')
## Data: dat
## Models:
## mod.d.l: mean_donation + 1 ~ text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g: mean_donation + 1 ~ goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g:     (1 | year)
##           Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)    
## mod.d.l    9 10632 10676 -5306.7    10614                             
## mod.d.l.g 10 10547 10597 -5263.5    10527 86.473      1  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g, mod.d.l.g.i, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g: mean_donation + 1 ~ goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g:     (1 | year)
## mod.d.l.g.i: mean_donation + 1 ~ inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i:     (1 | year)
##             Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.d.l.g   10 10547 10597 -5263.5    10527                           
## mod.d.l.g.i 13 10546 10611 -5260.1    10520 6.8005      3    0.07854 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i, mod.d.l.g.i.p, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i: mean_donation + 1 ~ inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i:     (1 | year)
## mod.d.l.g.i.p: mean_donation + 1 ~ photos_sc + inst + goal_sc + text_length_words_sc + 
## mod.d.l.g.i.p:     dur_cat + (1 | year)
##               Df   AIC   BIC  logLik deviance Chisq Chi Df Pr(>Chisq)   
## mod.d.l.g.i   13 10546 10611 -5260.1    10520                           
## mod.d.l.g.i.p 14 10541 10610 -5256.5    10513 7.194      1   0.007315 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p, mod.d.l.g.i.p.u, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p: mean_donation + 1 ~ photos_sc + inst + goal_sc + text_length_words_sc + 
## mod.d.l.g.i.p:     dur_cat + (1 | year)
## mod.d.l.g.i.p.u: mean_donation + 1 ~ updates_sc + photos_sc + inst + goal_sc + 
## mod.d.l.g.i.p.u:     text_length_words_sc + dur_cat + (1 | year)
##                 Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)  
## mod.d.l.g.i.p   14 10541 10610 -5256.5    10513                           
## mod.d.l.g.i.p.u 15 10540 10614 -5254.9    10510 3.1747      1    0.07479 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u, mod.d.l.g.i.p.u.c, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p.u: mean_donation + 1 ~ updates_sc + photos_sc + inst + goal_sc + 
## mod.d.l.g.i.p.u:     text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g.i.p.u.c: mean_donation + 1 ~ comments_sc + updates_sc + photos_sc + inst + 
## mod.d.l.g.i.p.u.c:     goal_sc + text_length_words_sc + dur_cat + (1 | year)
##                   Df   AIC   BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
## mod.d.l.g.i.p.u   15 10540 10614 -5254.9    10510                         
## mod.d.l.g.i.p.u.c 16 10538 10617 -5253.1    10506 3.6891      1    0.05477
##                    
## mod.d.l.g.i.p.u    
## mod.d.l.g.i.p.u.c .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c, mod.d.l.g.i.p.u.c.f, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c: mean_donation + 1 ~ comments_sc + updates_sc + photos_sc + inst + 
## mod.d.l.g.i.p.u.c:     goal_sc + text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g.i.p.u.c.f: mean_donation + 1 ~ friends_sc + comments_sc + updates_sc + photos_sc + 
## mod.d.l.g.i.p.u.c.f:     inst + goal_sc + text_length_words_sc + dur_cat + (1 | year)
##                     Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c   16 10538 10617 -5253.1    10506              
## mod.d.l.g.i.p.u.c.f 17 10528 10613 -5247.2    10494 11.818      1
##                     Pr(>Chisq)    
## mod.d.l.g.i.p.u.c                 
## mod.d.l.g.i.p.u.c.f  0.0005867 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c.f, mod.d.l.g.i.p.u.c.f.s, test='Chisq')
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f: mean_donation + 1 ~ friends_sc + comments_sc + updates_sc + photos_sc + 
## mod.d.l.g.i.p.u.c.f:     inst + goal_sc + text_length_words_sc + dur_cat + (1 | year)
## mod.d.l.g.i.p.u.c.f.s: mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f   17 10528 10613 -5247.2    10494              
## mod.d.l.g.i.p.u.c.f.s 18 10512 10602 -5238.3    10476 17.796      1
##                       Pr(>Chisq)    
## mod.d.l.g.i.p.u.c.f                 
## mod.d.l.g.i.p.u.c.f.s  2.459e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(mod.d.l.g.i.p.u.c.f.s)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: Gamma  ( log )
## Formula: 
## mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc +  
##     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat +  
##     (1 | year)
##    Data: dat
## 
##      AIC      BIC   logLik deviance df.resid 
##  10512.5  10601.7  -5238.3  10476.5     1031 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.8436 -0.6471 -0.1327  0.4307  6.9597 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  year     (Intercept) 0.0000   0.0000  
##  Residual             0.2015   0.4489  
## Number of obs: 1049, groups:  year, 6
## 
## Fixed effects:
##                        Estimate Std. Error t value Pr(>|z|)    
## (Intercept)           4.4893674  0.0280290 160.169  < 2e-16 ***
## shares_sc            -0.1171179  0.0270590  -4.328  1.5e-05 ***
## friends_sc           -0.0368704  0.0133066  -2.771  0.00559 ** 
## comments_sc           0.0005182  0.0185281   0.028  0.97769    
## updates_sc            0.0648605  0.0271654   2.388  0.01696 *  
## photos_sc            -0.0414823  0.0182199  -2.277  0.02280 *  
## instnone             -0.0298241  0.0345531  -0.863  0.38806    
## instsecondhalf        0.0522849  0.0388511   1.346  0.17837    
## instsecondquarter     0.0766515  0.0478274   1.603  0.10901    
## goal_sc               0.2148354  0.0221380   9.704  < 2e-16 ***
## text_length_words_sc  0.0093288  0.0149804   0.623  0.53346    
## dur_cat.L             0.0109864  0.0447438   0.246  0.80604    
## dur_cat.Q            -0.0480323  0.0378592  -1.269  0.20454    
## dur_cat.C            -0.0968333  0.0350208  -2.765  0.00569 ** 
## dur_cat^4             0.0225792  0.0328541   0.687  0.49192    
## dur_cat^5             0.0130812  0.0280177   0.467  0.64058    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation matrix not shown by default, as p = 16 > 12.
## Use print(x, correlation=TRUE)  or
##     vcov(x)        if you need it
## convergence code: 0
## singular fit

Add metaphors

# mod.no_metaphor = glmer(mean_donation+1 ~ no_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
#                         data = dat, family = Gamma(link = "log"))
# mod.any_metaphor = glmer(mean_donation+1 ~ any_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
#                         data = dat, family = Gamma(link = "log"))

mod.dom_journey = glmer(mean_donation+1 ~ dom_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
mod.dom_journey.prod = glmer(mean_donation+1 ~ journey_prod + dom_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat  + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
mod.dom_battle = glmer(mean_donation+1 ~ dom_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
mod.dom_battle.prod = glmer(mean_donation+1 ~ battle_prod + dom_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
mod.only_journey = glmer(mean_donation+1 ~ only_journey + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
mod.only_battle = glmer(mean_donation+1 ~ only_battle + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
mod.both_metaphor = glmer(mean_donation+1 ~ both_metaphor + shares_sc + friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + dur_cat + inst + (1|year),
                        data = dat, family = Gamma(link = "log"))
## singular fit
# anova(mod.d.l.g.i.p.u.c.f.s, mod.no_metaphor, test="Chisq")
# anova(mod.d.l.g.i.p.u.c.f.s, mod.any_metaphor, test="Chisq")
anova(mod.d.l.g.i.p.u.c.f.s, mod.dom_journey, test="Chisq")
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.dom_journey: mean_donation + 1 ~ dom_journey + shares_sc + friends_sc + comments_sc + 
## mod.dom_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_journey:     dur_cat + inst + (1 | year)
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 10512 10602 -5238.3    10476              
## mod.dom_journey       19 10512 10606 -5236.9    10474 2.8231      1
##                       Pr(>Chisq)  
## mod.d.l.g.i.p.u.c.f.s             
## mod.dom_journey          0.09292 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.dom_journey, mod.dom_journey.prod, test="Chisq")
## Data: dat
## Models:
## mod.dom_journey: mean_donation + 1 ~ dom_journey + shares_sc + friends_sc + comments_sc + 
## mod.dom_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_journey:     dur_cat + inst + (1 | year)
## mod.dom_journey.prod: mean_donation + 1 ~ journey_prod + dom_journey + shares_sc + 
## mod.dom_journey.prod:     friends_sc + comments_sc + updates_sc + photos_sc + goal_sc + 
## mod.dom_journey.prod:     text_length_words_sc + dur_cat + inst + (1 | year)
##                      Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.dom_journey      19 10512 10606 -5236.9    10474              
## mod.dom_journey.prod 20 10514 10613 -5236.8    10474 0.0705      1
##                      Pr(>Chisq)
## mod.dom_journey                
## mod.dom_journey.prod     0.7906
anova(mod.d.l.g.i.p.u.c.f.s, mod.dom_battle, test="Chisq")
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.dom_battle: mean_donation + 1 ~ dom_battle + shares_sc + friends_sc + comments_sc + 
## mod.dom_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_battle:     dur_cat + inst + (1 | year)
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 10512 10602 -5238.3    10476              
## mod.dom_battle        19 10509 10603 -5235.5    10471 5.5889      1
##                       Pr(>Chisq)  
## mod.d.l.g.i.p.u.c.f.s             
## mod.dom_battle           0.01807 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.dom_battle, mod.dom_battle.prod, test="Chisq")
## Data: dat
## Models:
## mod.dom_battle: mean_donation + 1 ~ dom_battle + shares_sc + friends_sc + comments_sc + 
## mod.dom_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_battle:     dur_cat + inst + (1 | year)
## mod.dom_battle.prod: mean_donation + 1 ~ battle_prod + dom_battle + shares_sc + friends_sc + 
## mod.dom_battle.prod:     comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.dom_battle.prod:     dur_cat + inst + (1 | year)
##                     Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.dom_battle      19 10509 10603 -5235.5    10471              
## mod.dom_battle.prod 20 10511 10610 -5235.4    10471 0.1036      1
##                     Pr(>Chisq)
## mod.dom_battle                
## mod.dom_battle.prod     0.7476
anova(mod.d.l.g.i.p.u.c.f.s, mod.only_journey, test="Chisq")
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.only_journey: mean_donation + 1 ~ only_journey + shares_sc + friends_sc + comments_sc + 
## mod.only_journey:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.only_journey:     dur_cat + inst + (1 | year)
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 10512 10602 -5238.3    10476              
## mod.only_journey      19 10513 10607 -5237.5    10475 1.5262      1
##                       Pr(>Chisq)
## mod.d.l.g.i.p.u.c.f.s           
## mod.only_journey          0.2167
anova(mod.d.l.g.i.p.u.c.f.s, mod.only_battle, test="Chisq")
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.only_battle: mean_donation + 1 ~ only_battle + shares_sc + friends_sc + comments_sc + 
## mod.only_battle:     updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.only_battle:     dur_cat + inst + (1 | year)
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 10512 10602 -5238.3    10476              
## mod.only_battle       19 10509 10603 -5235.5    10471 5.6452      1
##                       Pr(>Chisq)  
## mod.d.l.g.i.p.u.c.f.s             
## mod.only_battle           0.0175 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(mod.d.l.g.i.p.u.c.f.s, mod.both_metaphor, test="Chisq")
## Data: dat
## Models:
## mod.d.l.g.i.p.u.c.f.s: mean_donation + 1 ~ shares_sc + friends_sc + comments_sc + updates_sc + 
## mod.d.l.g.i.p.u.c.f.s:     photos_sc + inst + goal_sc + text_length_words_sc + dur_cat + 
## mod.d.l.g.i.p.u.c.f.s:     (1 | year)
## mod.both_metaphor: mean_donation + 1 ~ both_metaphor + shares_sc + friends_sc + 
## mod.both_metaphor:     comments_sc + updates_sc + photos_sc + goal_sc + text_length_words_sc + 
## mod.both_metaphor:     dur_cat + inst + (1 | year)
##                       Df   AIC   BIC  logLik deviance  Chisq Chi Df
## mod.d.l.g.i.p.u.c.f.s 18 10512 10602 -5238.3    10476              
## mod.both_metaphor     19 10511 10605 -5236.5    10473 3.5951      1
##                       Pr(>Chisq)  
## mod.d.l.g.i.p.u.c.f.s             
## mod.both_metaphor        0.05795 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

It appears that the number of shares via Facebook, the number of Facebook friends the project creator has, and the number of photos uploaded to the project page all significantly decrease the mean donation. Higher numbers of updates and higher goal amounts significantly increase the mean donation. The data is explained well by a cubic regression over duration. Most importantly though, having only battle metaphors significantly (although only slightly) increases mean donation, having the battle metaphor dominate significantly increases mean donation, having both metaphors almost significantly decreases mean donation.